#ifndef DOUBLE_LINKED_LIST_H
#define DOUBLE_LINKED_LIST_H

#include "simple.h"

struct dl_node
{
	elem_t data;

	struct dl_node * prev;
	struct dl_node * next;
};
typedef struct dl_node dl_node;

typedef dl_node * d_list;
typedef dl_node const * const_d_list;
typedef dl_node * dl_iterator;
typedef dl_node const * const_dl_iterator;

dl_node * dl_node_create(elem_t e);
void dl_node_release(dl_node * node);

d_list d_list_clone(const_d_list l);
void d_list_release(d_list l);

size_t d_list_len(const_d_list l);

#define d_list_empty(l) (l)

d_list d_list_append(d_list * l, elem_t * ep, size_t len);

void d_list_display(const_d_list l);

int d_list_get(const_d_list l, index_t i, elem_t * e);
index_t d_list_locate(const_d_list l, elem_t e);

dl_iterator d_list_insert(dl_iterator it, elem_t e);
dl_iterator d_list_delete(dl_iterator it, elem_t * e);

d_list d_list_sort(d_list * l);

d_list d_list_reverse(d_list * l);

#endif /* DOUBLE_LINKED_LIST_H */

